package com.zghhost.codedemo.jinzhi;

/**
 * @author guohua.zhang@zhaopin.com.cn
 * @Date 2019/1/14 10:50
 */
public class ErjinzhiTest {
    public static void main(String[] args){
        System.out.println("Byte:");
        System.out.println("java byte="+Byte.MIN_VALUE);
        byte byteMin = Double.valueOf(Math.pow(-2,7)).byteValue();
        System.out.println(byteMin);
        System.out.println(Integer.toBinaryString(byteMin));
        System.out.println("java short最大值(2^7-1)="+Byte.MAX_VALUE);
        byte byteM = Double.valueOf(Math.pow(2,7)-1).byteValue();
        System.out.println(byteM);
        System.out.println(Integer.toBinaryString(byteM));

        System.out.println("Short:");
        System.out.println("java short最小值="+Short.MIN_VALUE);
        short shortMin = Double.valueOf(Math.pow(-2,15)).shortValue();
        System.out.println(shortMin);
        System.out.println(Integer.toBinaryString(shortMin));
        System.out.println("java short最大值(2^15-1)="+Integer.MAX_VALUE);
        int shortM = Double.valueOf(Math.pow(2,15)-1).shortValue();
        System.out.println(shortM);
        System.out.println(Integer.toBinaryString(shortM));

        System.out.println("Integer:");
        System.out.println("java int最小值="+Integer.MIN_VALUE);
        int intMin = Double.valueOf(Math.pow(-2,31)).intValue();
        System.out.println(intMin);
        System.out.println(Integer.toBinaryString(intMin));
        System.out.println("java int最大值(2^31-1)="+Integer.MAX_VALUE);
        int intM = Double.valueOf(Math.pow(2,31)-1).intValue();
        System.out.println(intM);
        System.out.println(Integer.toBinaryString(intM));

        System.out.println("Long:");
        System.out.println("java long最小值="+Long.MIN_VALUE);
        long longMin = Double.valueOf(Math.pow(-2,63)).longValue();
        System.out.println(longMin);
        System.out.println(Long.toBinaryString(longMin));
        System.out.println("java long最大值(2^63-1)="+Long.MAX_VALUE);
        long longM = Double.valueOf(Math.pow(2,63)-1).longValue();
        System.out.println(longM);
        System.out.println(Long.toBinaryString(longM));

        System.out.println();

        //负数的存储方式二进制数据的最高位为1一定是负数最高位为0一定是证书 以补码方式存储
        //先取绝对值 然后取反 然后补码
        System.out.println("java 负数的内存存储方式");
        System.out.println("-8取绝对(9)"+Integer.toBinaryString(8)+"取反(~8)="+Integer.toBinaryString(~8)+"补1=11111111111111111111111111111000");
        System.out.println("-9取绝对(9)"+Integer.toBinaryString(9)+"取反(~9)="+Integer.toBinaryString(~9)+"补1=11111111111111111111111111110111");

        System.out.println();

        for(int i=-18,ic=i+50;i<ic;i++){
            System.out.println(i+"的二进制表示为 "+Integer.toBinaryString(i)
                    +"    八进制表示为 "+Integer.toOctalString(i)
                    +"    十六进制表示为 "+Integer.toHexString(i)
            );
        }


        System.out.println("位运算 位与 & 两位同时为“1”，结果才为“1”，否则为0 6=110B 11=1011B");
        System.out.println("可用于 清零 取一个数中指定位");
        System.out.println("位与6 & 11 ="+(6 & 11));

        System.out.println("位运算 位或 | 参加运算的两个对象只要有一个为1，其值为1，否则为0 6=110B 11=1011B");
        System.out.println("可用于 常用来对一个数据的某些位置1");
        System.out.println("位或6 | 11 ="+(6 | 11));

        System.out.println("位运算 异或 ^ 参加运算的两个对象，如果两个相应位为“异”（值不同），则该位结果为1，否则为0。 6=110B 11=1011B");
        System.out.println("可用于 使特定位翻转找一个数 与0相异或，保留原值");
        System.out.println("异或6 ^ 11 ="+(6 ^ 11));

        System.out.println("位运算 取反 ~ 对一个二进制数按位取反，即将0变1，1变0。 11=1011B");
        System.out.println("可用于 使一个数的最低位为零");
        System.out.println("~1="+ ~1 + "。低位变0（因为1取反 ~1=11111110 可以与其他书进行位与运算用来做低位变0） 11 & ~1="+(11 & ~1));

        System.out.println("位运算 左移 << 将一个运算对象的各二进制位全部左移若干位（左边的二进制位丢弃，右边补0）(相当于原数 * 2^移位次方)");
        System.out.println("1的二进制表示为00000001左移1位为00000010变成2. 1 << 1="+ (1 << 1));
        System.out.println("1 << 2="+ (1 << 2));
        System.out.println("-1 << 2="+ (-1 << 2));

        System.out.println("位运算 右移 >> 将一个数的各二进制位全部右移若干位，正数左补0，负数左补1，右边丢弃。(相当于原数 / 2^移位次方)");
        System.out.println("6的二进制表示为00000110左移1位为00000011变成3. 6 >> 1="+ (6 >> 1));
        System.out.println("12 >> 2="+ (12 >> 2));
        System.out.println("-12 >> 2="+ (-12 >> 2));

        System.out.println("位运算 无符号右移 将一个数的各二进制位全部右移若干位，左补0，右边丢弃");
        System.out.println("18的二进制表示为10010右移1位表示为 01001 18 >>> 1="+ (18 >>> 1));
        System.out.println("-18的二进制表示为11111111111111111111111111101110右移1位表示为 01111111111111111111111111110111 -18 >>> 1="+ (-18 >>> 1));
        System.out.println("01111111111111111111111111110111转10进制="+Integer.parseInt("01111111111111111111111111110111",2));

    }
}
